package ren.renshuaipeng.auth.service.auth;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import ren.renshuaipeng.auth.common.AppContants;
import ren.renshuaipeng.auth.dao.auth.AuthUserDao;
import ren.renshuaipeng.auth.domain.auth.AuthUser;
import ren.renshuaipeng.util.security.Digests;
import ren.renshuaipeng.util.security.Encodes;

import javax.annotation.Resource;

/**
 * ClassName: AuthUserService<br/>
 * Function: 权限用户操作. <br/>
 * Date: 2015/12/15 15:53<br/>
 *
 * @author 任帅鹏（作者）
 * @version V1.00 （版本号）
 * @see
 * @since JDK 1.8
 */
@Service
@Transactional(readOnly = true)
public class AuthUserService {

	@Resource
	AuthUserDao authUserDao;

	/**
	 * @Name: save
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 14:57:28（创建日期）
	 * @Parameters: [authUser]
	 * @Return ren.renshuaipeng.auth.domain.auth.AuthUser
	 * @Throws
	 */
	@Transactional
	public AuthUser save(AuthUser authUser, boolean isSetPwd) {
		// 1.生成密码
		if (isSetPwd) {
			entryptPassword(authUser);
		}
		return authUserDao.save(authUser);
	}

	/**
	 * @Name: entryptPassword
	 * @Description: 设定安全的密码，生成随机的salt并经过1024次 sha-1 hash
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015年12月18日 下午4:18:13（创建日期）
	 * @Parameters: @param user
	 * @Return void
	 * @Throws
	 */
	private void entryptPassword(AuthUser authUser) {
		byte[] salt = Digests.generateSalt(AppContants.SALT_SIZE);
		authUser.setLoginSalt(Encodes.encodeHex(salt));

		byte[] hashPassword = Digests.sha1(authUser.getLoginPwd().getBytes(), salt, AppContants.HASH_INTERATIONS);
		authUser.setLoginPwd(Encodes.encodeHex(hashPassword));
	}

	/**
	 * @Name: findPage
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 15:00:35（创建日期）
	 * @Parameters: [pageable]
	 * @Return org.springframework.data.domain.Page
	 *         <ren.renshuaipeng.auth.domain.auth.AuthUser>
	 * @Throws
	 */
	public Page<AuthUser> findPage(Pageable pageable) {
		return authUserDao.findAll(pageable);
	}

	/**
	 * @Name: delete
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 15:42:14（创建日期）
	 * @Parameters: [id]
	 * @Return void
	 * @Throws
	 */
	@Transactional
	public void delete(String id) {
		authUserDao.delete(id);
	}

	/**
	 * @Name: findOne
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 15:42:43（创建日期）
	 * @Parameters: [id]
	 * @Return ren.renshuaipeng.auth.domain.auth.AuthUser
	 * @Throws
	 */
	public AuthUser findOne(String id) {
		return authUserDao.findOne(id);
	}

	/**
	 * 
	 *
	 * @Name: findByLoginName
	 * @Description: TODO
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015年12月18日 上午10:16:29（创建日期）
	 * @Parameters: @param loginName
	 * @Parameters: @return
	 * @Return AuthUser
	 * @Throws
	 */
	public AuthUser findByLoginName(String loginName) {
		return authUserDao.findByLoginName(loginName);
	}
}
